home *** CD-ROM | disk | FTP | other *** search
/ Enigma Amiga Life 109 / EnigmaAmiga109CD.iso / dalla rivista / amiga.free / sorgenti vari / wolfedit2 2.0.4 source.sit / WolfEdit2 2.0.4 Source / UMapListView.p < prev    next >
Text File  |  1996-04-13  |  8KB  |  398 lines

  1. unit UMapListView;
  2.  
  3. interface
  4.     uses
  5.         UWolfDoc;
  6.  
  7.     const
  8.  
  9.         newLevelCmd = 401;
  10.         getLevelInfoCmd = 403;
  11.  
  12.     procedure CreateLevel (view: TView);
  13.     procedure GetInfoForLevel (view: TView; n: integer);
  14.  
  15. implementation
  16.     uses
  17.         UGoof, UList, UXWindow, ULevelInfo, UFree;
  18.  
  19.     const
  20.  
  21.         openLevelCmd = 402;
  22.  
  23.         mapListWinID = 129;
  24.  
  25.         levelInfoScrapType = 'W3dP';
  26.         levelRsrcScrapType = 'W3dR';
  27.  
  28.     type
  29.  
  30.         TMapListView = object(TList)
  31.                 fMapList: TMapListDoc;
  32.                 fUndo: TMapListUndo;
  33.                 procedure IMapListView (itsMapList: TMapListDoc);
  34.                 procedure Free;
  35.                 override;
  36.                 procedure DiscardUndo;
  37.                 procedure DrawCell (cell: Point; r: Rect; var hilite: boolean);
  38.                 override;
  39.                 procedure SetupMenus;
  40.                 override;
  41.                 procedure DoMenuCommand (cmdNumber: integer);
  42.                 override;
  43.                 procedure DoubleClick (var e: EventInfo);
  44.                 override;
  45.                 procedure DoNewLevel;
  46.                 procedure DoOpenLevel;
  47.                 procedure DoGetInfo;
  48.                 procedure GetInfoFor (n: integer);
  49.                 procedure DoUndo;
  50.                 procedure DoCut;
  51.                 procedure DoCopy;
  52.                 procedure DoPaste;
  53.                 procedure DoClear;
  54.                 function CheckEdit (what: string; result: OSErr): boolean;
  55.                 function Copy: OSErr;
  56.                 function Clear: OSErr;
  57.                 procedure UpdateDimensions;
  58.             end;
  59.  
  60.         TMapListUndo = object(TObject)
  61.                 fNext: TMapListUndo;
  62.                 fLevelNumber: integer;
  63.                 fInfo: LevelInfoHandle;
  64.                 fResource: LevelHandle;
  65.             end;
  66.  
  67.         TMapListWindow = object(TXWindow)
  68.                 fMapListView: TMapListView;
  69.                 procedure Close;
  70.                 override;
  71.                 procedure Activate;
  72.                 override;
  73.             end;
  74.  
  75.     procedure TMapListWindow.Close;
  76.     begin
  77.         if fDocument.DoClose(false) then
  78.             ;
  79.     end;
  80.  
  81.     procedure TMapListWindow.Activate;
  82.     begin
  83.         inherited Activate;
  84.         fMapListView.BecomeTarget;
  85.     end;
  86.  
  87.     procedure TMapListDoc.MakeWindow;
  88.         var
  89.             win: TMapListWindow;
  90.             view: TMapListView;
  91.     begin
  92.         new(win);
  93.         win.IGetNewWindow(self, mapListWinID, [wGoAwayBox, wGrowBox, wCloseOnGoAway]);
  94.         new(view);
  95.         view.IMapListView(self);
  96.         win.fMapListView := view;
  97.         win.Place(view, nil, nil, 0, 0, fill, fill, [frmVScroll, frmGrowBox, frmHResize, frmVResize, frmBorder]);
  98.         win.Show;
  99.         if (fNumLevels = 1) & (fIndex^^[1].resource = nil) then
  100.             OpenLevel(1);
  101.     end;
  102.  
  103.     procedure TMapListView.IMapListView (itsMapList: TMapListDoc);
  104.         var
  105.             cellSize, borderSize: Point;
  106.             dimensions: Rect;
  107.     begin
  108.         SetPt(cellSize, 1024, 16);
  109.         SetPt(borderSize, 0, 0);
  110.         SetRect(dimensions, 0, 1, 1, 1);
  111.         IListX(cellSize, borderSize, dimensions, []);
  112.         fMapList := itsMapList;
  113.         if itsMapList <> nil then
  114.             itsMapList.fView := self;
  115.         fUndo := nil;
  116.         UpdateDimensions;
  117.     end;
  118.  
  119.     procedure TMapListView.Free;
  120.     begin
  121.         DiscardUndo;
  122.         inherited Free;
  123.     end;
  124.  
  125.     procedure TMapListView.DiscardUndo;
  126.         var
  127.             u: TMapListUndo;
  128.     begin
  129.         while fUndo <> nil do begin
  130.                 u := fUndo;
  131.                 fUndo := fUndo.fNext;
  132.                 if u.fInfo <> nil then
  133.                     DisposeLevelInfo(u.fInfo);
  134.                 if u.fResource <> nil then
  135.                     DisposeLevel(u.fResource);
  136.                 u.Free;
  137.             end;
  138.     end;
  139.  
  140.     procedure TMapListView.DrawCell (cell: Point; r: Rect; var hilite: boolean);
  141.         var
  142.             number: string[6];
  143.     begin
  144.         TextFont(geneva);
  145.         TextSize(12);
  146.         if hilite then begin
  147.                 FillRect(r, black);
  148.                 TextMode(srcBic);
  149.                 hilite := false;
  150.             end
  151.         else begin
  152.                 FillRect(r, white);
  153.                 TextMode(srcOr);
  154.             end;
  155.         number := StringOf(cell.v : 1);
  156.         MoveTo(r.left + 20 - StringWidth(number), r.bottom - 4);
  157.         DrawString(number);
  158.         Move(10, 0);
  159.         DrawString(fMapList.GetLevelName(cell.v));
  160.     end;
  161.  
  162.     procedure TMapListView.SetupMenus;
  163.  
  164.         function ProbeScrap (typ: OSType): boolean;
  165.             var
  166.                 offset: longint;
  167.         begin
  168.             ProbeScrap := GetScrap(nil, typ, offset) >= 0;
  169.         end;
  170.  
  171.     begin
  172.         EnableCmd(newLevelCmd);
  173.         if not EmptyRect(fSelection) then begin
  174.                 EnableCmd(openLevelCmd);
  175.                 EnableCmd(getLevelInfoCmd);
  176.                 EnableCmd(cutCmd);
  177.                 EnableCmd(copyCmd);
  178.                 EnableCmd(clearCmd);
  179.             end;
  180.         if ProbeScrap(levelInfoScrapType) & ProbeScrap(levelRsrcScrapType) then
  181.             EnableCmd(pasteCmd);
  182.         if fUndo <> nil then
  183.             EnableCmd(undoCmd);
  184.         inherited SetupMenus;
  185.     end;
  186.  
  187.     procedure TMapListView.DoMenuCommand (cmdNumber: integer);
  188.     begin
  189.         case cmdNumber of
  190.             newLevelCmd: 
  191.                 DoNewLevel;
  192.             openLevelCmd: 
  193.                 DoOpenLevel;
  194.             getLevelInfoCmd: 
  195.                 DoGetInfo;
  196.             undoCmd: 
  197.                 DoUndo;
  198.             cutCmd: 
  199.                 DoCut;
  200.             copyCmd: 
  201.                 DoCopy;
  202.             pasteCmd: 
  203.                 DoPaste;
  204.             clearCmd: 
  205.                 DoClear;
  206.             otherwise
  207.                 inherited DoMenuCommand(cmdNumber);
  208.         end;
  209.     end;
  210.  
  211.     procedure TMapListView.DoUndo;
  212.         var
  213.             u: TMapListUndo;
  214.     begin
  215.         while fUndo <> nil do begin
  216.                 u := fUndo;
  217.                 fUndo := fUndo.fNext;
  218.                 fMapList.InsertLevel(u.fLevelNumber, u.fInfo, u.fResource);
  219.                 UpdateDimensions;
  220.                 SetSelection(0, u.fLevelNumber, 1, u.fLevelNumber + 1);
  221.                 u.Free;
  222.             end;
  223.         Invalidate;
  224.     end;
  225.  
  226.     function TMapListView.CheckEdit (what: string; result: OSErr): boolean;
  227.     begin
  228.         if result = noErr then
  229.             CheckEdit := true
  230.         else begin
  231.                 fMapList.LevelError(what, fSelection.top, result);
  232.                 CheckEdit := false;
  233.             end;
  234.     end;
  235.  
  236.     procedure TMapListView.DoCut;
  237.     begin
  238.         if CheckEdit('cut', Copy) then
  239.             if CheckEdit('cut', Clear) then
  240.                 ;
  241.     end;
  242.  
  243.     procedure TMapListView.DoCopy;
  244.     begin
  245.         if CheckEdit('copy', Copy) then
  246.             ;
  247.     end;
  248.  
  249.     function TMapListView.Copy: OSErr;
  250.         var
  251.             p, h: Handle;
  252.  
  253.         procedure Check (result: longint);
  254.         begin
  255.             if result < 0 then begin
  256.                     Copy := result;
  257.                     exit(Copy);
  258.                 end;
  259.         end;
  260.  
  261.         procedure WriteScrap (h: Handle; typ: OSType);
  262.         begin
  263.             Check(PutScrap(GetHandleSize(h), typ, h^));
  264.         end;
  265.  
  266.     begin {Copy}
  267.         with fMapList.fIndex^^[fSelection.top] do begin
  268.                 p := Handle(info);
  269.                 h := Handle(resource);
  270.             end;
  271.         Check(ZeroScrap);
  272.         WriteScrap(p, levelInfoScrapType);
  273.         WriteScrap(h, levelRsrcScrapType);
  274.         Copy := noErr;
  275.     end;
  276.  
  277.     procedure TMapListView.DoPaste;
  278.         var
  279.             p, h: Handle;
  280.             len, offset: longint;
  281.             n: integer;
  282.  
  283.         procedure Check (result: longint);
  284.         begin
  285.             if result < 0 then begin
  286.                     DoAlert(clipReadFailedAlertID);
  287.                     DisposHandle(p);
  288.                     DisposHandle(h);
  289.                     exit(DoPaste);
  290.                 end;
  291.         end;
  292.  
  293.     begin {DoPaste}
  294.         p := NewHandle(0);
  295.         h := NewHandle(0);
  296.         Check(GetScrap(p, levelInfoScrapType, offset));
  297.         Check(GetScrap(h, levelRsrcScrapType, offset));
  298.         if not EmptyRect(fSelection) then
  299.             n := fSelection.top
  300.         else
  301.             n := fMapList.fNumLevels + 1;
  302.         fMapList.InsertLevel(n, LevelInfoHandle(p), LevelHandle(h));
  303.         UpdateDimensions;
  304.         SetSelection(0, n, 1, n + 1);
  305.         Invalidate;
  306.     end;
  307.  
  308.     procedure TMapListView.DoClear;
  309.     begin
  310.         if CheckEdit('clear', Clear) then
  311.             ;
  312.     end;
  313.  
  314.     function TMapListView.Clear: OSErr;
  315.         var
  316.             n: integer;
  317.             u: TMapListUndo;
  318.  
  319.         procedure Check (result: longint);
  320.         begin
  321.             if result < 0 then begin
  322.                     Clear := result;
  323.                     exit(Clear);
  324.                 end;
  325.         end;
  326.  
  327.     begin {Clear}
  328.         n := fSelection.top;
  329.         DiscardUndo;
  330.         new(u);
  331.         u.fNext := fUndo;
  332.         fUndo := u;
  333.         u.fLevelNumber := n;
  334.         Check(fMapList.CutLevel(n, u.fInfo, u.fResource));
  335.         ClearSelection;
  336.         Invalidate;
  337.         UpdateDimensions;
  338.         Clear := noErr;
  339.     end;
  340.  
  341.     procedure TMapListView.DoubleClick (var e: EventInfo);
  342.     begin
  343.         if not EmptyRect(fSelection) then
  344.             DoOpenLevel;
  345.     end;
  346.  
  347.     procedure TMapListView.DoNewLevel;
  348.         var
  349.             n: integer;
  350.     begin
  351.         fMapList.NewLevel;
  352.         fMapList.Changed;
  353.         UpdateDimensions;
  354.         n := fMapList.fNumLevels;
  355.         fMapList.OpenLevel(n);
  356.         SetSelection(0, n, 1, n + 1);
  357.     end;
  358.  
  359.     procedure TMapListView.DoOpenLevel;
  360.     begin
  361.         fMapList.OpenLevel(fSelection.top);
  362.     end;
  363.  
  364.     procedure TMapListView.DoGetInfo;
  365.     begin
  366.         GetInfoFor(fSelection.top);
  367.     end;
  368.  
  369.     procedure TMapListView.GetInfoFor (n: integer);
  370.         var
  371.             map: TMap;
  372.     begin
  373.         if EditLevelInfo(fMapList, n) then begin
  374.                 fMapList.Changed;
  375.                 InvalidateCells(fSelection);
  376.                 map := fMapList.fIndex^^[n].map;
  377.                 if (map <> nil) & (map.fView <> nil) then
  378.                     map.fView.fFrame.fWindow.UpdateTitle;
  379.                 fFrame.fWindow.UpdateTitle;
  380.             end;
  381.     end;
  382.  
  383.     procedure TMapListView.UpdateDimensions;
  384.     begin
  385.         SetDimensions(0, 1, 1, fMapList.fNumLevels + 1);
  386.     end;
  387.  
  388.     procedure CreateLevel (view: TView);
  389.     begin
  390.         TMapListView(view).DoNewLevel;
  391.     end;
  392.  
  393.     procedure GetInfoForLevel (view: TView; n: integer);
  394.     begin
  395.         TMapListView(view).GetInfoFor(n);
  396.     end;
  397.  
  398. end.